import sys  
from PyQt5.QtWidgets import QApplication, QWidget  
from PyQt5.QtGui import QPixmap, QPainter, QRegion, QBitmap,QColor
from PyQt5.QtCore import Qt
  
class ShapedWindow(QWidget):  
    def __init__(self):  
        super().__init__()  
    
        # 隐藏窗体的边框（可选）  
        # self.setWindowFlags(self.windowFlags() & ~Qt.FramelessWindowHint) 
        # 设置无边框  
        self.setWindowFlags(Qt.FramelessWindowHint)  
        # 设置窗口背景透明
        self.setAttribute(Qt.WA_TranslucentBackground) 

        # 加载 PNG 图片  
        self.shape_pixmap = QPixmap('circle_back_5.png')   
        # circle_back_1,circle_back_2为白色背景，circle_back_3为蓝色背景
  
        # 设置窗体大小和形状  
        self.setFixedSize(self.shape_pixmap.size())  
  
        # 创建一个与 PNG 图片形状相同的遮罩  
        self.mask = QBitmap(self.shape_pixmap.size())  
        self.mask.fill(Qt.color0)  # 在 QBitmap 上下文中，Qt.color0 通常表示透明（白色）
        # 默认也是白色为背景色，用白色背景的图片，结果白色区域是透明区域
        painter = QPainter(self.mask)  

        # 以下代码消除白色变成了透明色的默认操作--------------
        # 绘制一个与 QImage 大小相同的矩形，只绘制非透明的像素（基于 alpha 通道）  
        painter.setCompositionMode(QPainter.CompositionMode_Source)  
        # 创建一个与 QPixmap 相同大小的 QImage 对象，以便我们可以访问 alpha 通道  
        image = self.shape_pixmap.toImage() 
        painter = QPainter(image)  
        painter.setCompositionMode(QPainter.CompositionMode_SourceOver)
        # --------------这样图片是什么样的，窗体就是什么样的了，不会把图片的白色变成透明，而是保留原图的颜色
        # 如果图片本身是没有白色的，那么这个代码可以省略

        painter.drawPixmap(0, 0, self.shape_pixmap)  
        painter.end()  
  
        # 设置窗体的遮罩  
        self.setMask(self.mask)  
  
    def paintEvent(self, event):  
        # 在这里绘制你的内容，如果需要的话  
        painter = QPainter(self)  
        painter.drawPixmap(0, 0, self.shape_pixmap)  

    # 这里还可以添加鼠标事件处理，以便用户可以拖动窗体  
    def mousePressEvent(self, event):  
        self.drag_position = event.globalPos() - self.frameGeometry().topLeft()  
  
    def mouseMoveEvent(self, event):  
        if event.buttons() == Qt.LeftButton:  
            self.move(event.globalPos() - self.drag_position)
  
if __name__ == '__main__':  
    app = QApplication(sys.argv)  
    window = ShapedWindow()  
    window.show()  
    sys.exit(app.exec_())